<?php
#### FUNCTIONS #################################################################
function db($type = false) {
	if ($type) return base()->loader->library->$type;
	return base()->loader->library->db; 
}

#### DATABASE LIBRARY ##########################################################
class DatabaseLibrary {
	
	private $sql;
	private $lastSql;
	private $and;
	
	#### GET SQL ###############################################################
	public function getSQL() { return $this->sql; }
	
	#### GET LAST SQL ##########################################################
	public function getLastSQL() { return $this->lastSql; }
	
	#### ADD SQL ###############################################################
	public function addSQL($sql) { 
		$this->lastSql .= $this->sql; 
		$this->sql .= $sql;
		return $this;
	}	
	
	#### SET SQL ###############################################################
	public function setSQL($sql = null) { 
		$this->lastSql = $this->sql; 
		$this->sql = $sql; 
	}
	
	#### PRINT SQL #############################################################
	public function printSQL() { echo $this->sql; }
	
	#### PRINT LAST SQL ########################################################
	public function printLastSQL() { echo $this->lastSql; }	
	
	#### END SQL ###############################################################
	public function endSQL() {
		$this->and = null;
		$this->sql .= ';';
		return $this;
	}	
	
	#### ERROR #################################################################
	public function error() {
		$trace = debug_backtrace();
		$message = '<b>Database Error:</b> ('.$this->errorCode().') ';
		$message .= $this->errorMessage();
		$message .= '<br /><b>File:</b> '. $trace[0]['file'];
		$message .= '<br /><b>Line:</b> '. $trace[0]['line'];
		$message .= '<br /><b>SQL:</b> '.$this->getLastSQL();
		echo '<br />'.$message;
	}	
	
	#### SELECT ################################################################
	public function select($field = '*') {
		$this->sql .= 'SELECT '.$field;
		return $this;
	}
	
	#### INSERT ################################################################
	public function insert($table, $array = false, $operation = 'INSERT') {
		if ($array) {
			$fields = array_keys($array);
			$values = array_values($array);
			foreach ($fields as $value) $clean_fields[] = '`'.addslashes($value).'`';
			foreach ($values as $value) $clean_values[] = addslashes($value);
		} else {
			$this->sql .= $operation.' INTO `'.$table.'` () VALUES ()';
			return $this;
		}
		$this->sql .= $operation.' INTO `'.$table.'` ('
			.implode(', ', $clean_fields).") VALUES ('"
			.implode("', '", $clean_values)."')";
		return $this;
	}

	#### REPLACE ###############################################################
	public function replace($table, $set) {
		$this->insert($table, $set, 'REPLACE');
	}	
	
	#### UPDATE ################################################################
	public function update($table) {
		$this->sql .= 'UPDATE `'.$table.'`';
		return $this;
	}
	
	#### DELETE ################################################################
	public function delete($table) {
		$this->sql .= 'DELETE FROM `'.$table.'`';
		return $this;
	}	
	
	#### FROM ##################################################################
	public function from($table) {
		$this->sql .= ' FROM `'.$table.'`';
		return $this;
	}
	
	#### SET ###################################################################
	public function set($array) {
		$set = null;
		if (!is_array($array)) { $this->sql .= ' SET '.$array; return $this; } 
		foreach ($array as $field => $value) {
			if (!is_array($value)) {
				$field = addslashes($field);
				$value = addslashes($value);
				$set[] = '`'.$field."`='".$value."'";
			}
		}
		$this->sql .= ' SET '.implode(', ', $set);
		return $this;
	}	
	
	#### WHERE #################################################################
	public function where($conditions) {
		
		if (is_array($conditions)) {
			foreach ($conditions as $field => $value) {
				$field = addslashes($field);
				$value = addslashes($value);
				$this->sql .= ($this->and['where'] ? ' AND ' : ' WHERE ');
				$this->sql .= $field."='".$value."'";
				$this->and['where'] = true;
			}
		}
		else {
			if ($conditions) {
				$this->sql .= ($this->and['where'] ? ' AND ' : ' WHERE ');
				$this->sql .= $conditions;
			}
			$this->and['where'] = true;
		}
		
		return $this;
	}
	
	#### GROUP BY ##############################################################
	public function groupBy($field) {
		$this->sql .= ' GROUP BY '.$field;
		return $this;
	}
	
	#### HAVING ################################################################
	public function having($field) {
		$this->sql .= ' HAVING '.$field;
		return $this;
	}	
	
	#### ORDER BY ##############################################################
	public function orderBy($field, $order = 'asc') {
		$this->sql .= ' ORDER BY '.$field.' '.strtoupper($order);
		return $this;
	}
	
	#### COUNT #################################################################
	public function count($field = '*') {
		$this->sql .= ' COUNT '.$field;
		return $this;
	}
	
	#### LIKE ##################################################################
	public function like($string) {
		if ($string) $this->sql .= ' LIKE '.$string;
		return $this;
	}	
	
	#### LIMIT #################################################################
	public function limit($condition) {
		if (is_array($condition)) { $this->sql .= ' LIMIT '.$condition[0].', '.$condition[1];}
		else if ($condition) $this->sql .= ' LIMIT '.$condition;
		return $this;
	}
}
?>